﻿using System.Drawing;
using System.Windows.Forms;

namespace GDI
{
    public partial class SplashScreenForm : ExtendedForm
    {
        /* ------------------------------------------------------------------------------------------ */



        /* ------------------------------------------------------------------------------------------ */



        /* ------------------------------------------------------------------------------------------ */

        // Поле: служебная переменная хранящая значение текущей прозрачности
        private int f_OpacityCounter;
        // Поля: скорость проявления и скорость скрытия (1-255)
        private int f_FadeInSpeed = 10;
        private int f_FadeOutSpeed = 40;
        // Поле: флаг, отражающий, что сейачс происходит, проявление или скрытие
        private bool f_Fadeout;

        private readonly Bitmap f_Bitmap;

        /* ------------------------------------------------------------------------------------------ */



        /* ------------------------------------------------------------------------------------------ */

        public SplashScreenForm(Bitmap image, int FadeInSpeed = 10, int FadeOutSpeed = 40)
        {
            f_FadeInSpeed = f_FadeInSpeed;
            f_FadeOutSpeed = f_FadeOutSpeed;

            f_Bitmap = image;

            // Устанавливаем наше изображение для отображение. Уровень прозрачности 0
            // Тоесть рисуется так, как есть
            SetBitmap(f_Bitmap, 0);

            // Устанавливаем наше изображение четко по центру экрана
            Location = new Point(
                Screen.PrimaryScreen.Bounds.Width / 2 - f_Bitmap.Width / 2,
                Screen.PrimaryScreen.Bounds.Height / 2 - f_Bitmap.Height / 2);

            InitializeComponent();
        }

        /* ------------------------------------------------------------------------------------------ */

        protected override void OnShown(System.EventArgs e)
        {
            base.OnShown(e);
            UpdateTimer.Enabled = true;
        }

        /* ------------------------------------------------------------------------------------------ */

        private void UpdateTimer_Tick(object sender, System.EventArgs e) { FadeInOut(); }

        private void FadeInOut()
        {
            // Если сплеш проявляется
            if(!f_Fadeout)
            {
                // Увеличиваем уровень видимости
                f_OpacityCounter += f_FadeInSpeed;
                // Осуществляем проверку, если уровень прозрачности у нас превысил 255, 
                // Возвращаем его к значеню 255 (ибо это максимум) и устанавливаем флаг,
                // что теперь у нас происходит скрытие
                if(f_OpacityCounter > 255)
                {
                    f_OpacityCounter = 255;
                    f_Fadeout = true;
                }
            }
            // Если скрытие
            else
            {
                // Уменьшаем значение прозрачности
                f_OpacityCounter -= f_FadeOutSpeed;
                // Если значение у нас получилось меньше 0,
                // то возвращаем его в 0 (ибо это минимум)
                // Затем выключаем таймер и закрываем нашу сплеш скрин
                if(f_OpacityCounter < 0)
                {
                    f_OpacityCounter = 0;
                    UpdateTimer.Enabled = false;
                    Close();
                }
            }
            // Проверяем жив ли наш объект, и если он жив, то применяем настройки прозрачности
            if(!IsDisposed)
                SetBitmap(f_Bitmap, (byte)f_OpacityCounter);
        }

        /* ------------------------------------------------------------------------------------------ */
    }
}
